package com.share2.thread2;


public class Demo1_Notify {

	/**
	 * @param args
	 * 等待唤醒机制
	 */
	public static void main(String[] args) {
		final Printer p = new Printer();
		
		new Thread() {
			public void run() {
				while(true) {
					try {
						p.print1();
					} catch (InterruptedException e) {
						
						e.printStackTrace();
					}
				}
			}
		}.start();
		
		new Thread() {
			public void run() {
				while(true) {
					try {
						p.print2();
					} catch (InterruptedException e) {
						
						e.printStackTrace();
					}
				}
			}
		}.start();
	}

}

//等待唤醒机制
class Printer {
	private int flag = 1;
	public void print1() throws InterruptedException {							
		synchronized(this) {//在同步块中，cpu不会切到切到其他线程（不会释放锁），除非在wait状态
			if(flag != 1) {
				this.wait();					//当前线程等待----因为锁对象是任意的，多以wait方法放在Object中
			}
			System.out.print("1");
			System.out.print("2");
			System.out.print("3");
			System.out.print("4");
			System.out.print("5");
			System.out.print("\r\n");
			flag = 2;
			this.notify();						//随机唤醒单个等待的线程---别唤醒的那个线程有执行资格，没有执行权，所谓的就绪状态
			
			Thread.sleep(3000);                 //注：唤醒线程，并不是马上切到另一个线程。释放锁，才有可能切到另一个线程
			                                      //注：同步块执行完毕之后，会释放锁，才有可能切到另一个线程
		}
	}
	
	public void print2() throws InterruptedException {
		synchronized(this) {
			if(flag != 2) {
				this.wait();
				Thread.sleep(3000);//没有等待3s，说明wait之后马上释放锁了
			}
			System.out.print("a");
			System.out.print("b");
			System.out.print("c");
			System.out.print("d");
			System.out.print("\r\n");
			flag = 1;
			this.notify();
		}
	}
}

